# -*- coding: utf-8 -*-
# Create your views here.
from autores.forms import AutorForm, ExpertoAutorForm
from autores.models import Autor
from buscador.forms import PublicacionBuscarForm
from django.contrib.auth.decorators import login_required, user_passes_test
from django.core.context_processors import csrf
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response, get_object_or_404
from django.template.context import RequestContext
from django.views.generic.create_update import update_object, create_object, \
    delete_object
from django.views.generic.list_detail import object_list, object_detail
from publicaciones.forms import PublicacionForm, ArticuloForm, CapituloForm, \
    LibroForm, ConferenciaForm, ReporteForm, TesisForm
from publicaciones.models import Publicacion, Articulo, Capitulo, Libro, \
    Conferencia, Reporte, Tesis
from usuarios.permisos import es_del_grupo_de_expertos


def get_form_for_object(tipo_de_pub):
    if tipo_de_pub == 'articulo':
        model_a_pasar = Articulo
        form_a_pasar = ArticuloForm
    elif tipo_de_pub == 'capitulo':
        model_a_pasar = Capitulo
        form_a_pasar = CapituloForm
    elif tipo_de_pub == 'libro':
        model_a_pasar = Libro
        form_a_pasar = LibroForm
    elif tipo_de_pub == 'conferencia':
        model_a_pasar = Conferencia
        form_a_pasar = ConferenciaForm
    elif tipo_de_pub == 'reporte':
        model_a_pasar = Reporte
        form_a_pasar = ReporteForm
    elif tipo_de_pub == 'tesis':
        model_a_pasar = Tesis
        form_a_pasar = TesisForm
    return model_a_pasar,form_a_pasar

def listar(request):    #seria la pagina de inicio para las proyectos
    return object_list(request,
                       queryset = Publicacion.objects.all(),
                       allow_empty = True,
                       template_name = 'publicaciones/listar.html'
                       )
    
def filtrar(request):    #seria la pagina de inicio para las especies
    form = PublicacionBuscarForm()
    q = None
    if request.method == 'POST':
        form = PublicacionBuscarForm(request.POST)
        if form.is_valid():
            q = Publicacion.objects
            if form.cleaned_data['titulo']:
                q =  q.filter(titulo__icontains = form.cleaned_data['titulo'])
            if form.cleaned_data['keywords']:
                q =  q.filter(palabras_clave__icontains = form.cleaned_data['keywords'])
            if form.cleaned_data['dato']:
                q =  q.filter(datos = form.cleaned_data['dato'])
            if form.cleaned_data['lineas']:
                q =  q.filter(lineas = form.cleaned_data['lineas'])
            if form.cleaned_data['tipo']:
                q =  q.filter(real_type__name = form.cleaned_data['tipo'])
            if form.cleaned_data['desde']:
                q =  q.filter(anho__gte = form.cleaned_data['desde'])
            if form.cleaned_data['hasta']:
                q =  q.filter(anho__lte = form.cleaned_data['hasta'])
            if form.cleaned_data['institucion']:
                q =  q.filter(instituciones = form.cleaned_data['institucion'])
            if form.cleaned_data['proyecto']:
                q =  q.filter(publicaciones_relacionadas = form.cleaned_data['proyecto'])
            if q == Publicacion.objects:
                q = None
    return object_list(request,
                       queryset = Publicacion.objects.all(),
                       allow_empty = True,
                       extra_context = {'form' : form, 'detalles' : q },
                       template_name = 'publicaciones/filtrar.html'
                       )

def ver(request, object_id):
    publicacion = get_object_or_404(Publicacion, pk=object_id)
    extra_context = {'object_id':publicacion.pk} 
    puede_ver = True
    if publicacion.nivel == 'US' and not request.user.is_authenticated():
        puede_ver = False
    try:
        if publicacion.nivel == 'EX' and not request.user.get_profile().experto:
            puede_ver = False
    except:
        puede_ver = False
    if publicacion.nivel == 'AD' and not request.user.is_superuser:
        puede_ver = False
    
    if not puede_ver:
        extra_context.update({'error':u'El nivel de acceso no le permite acceder a esta publicación'})
        extra_context.update({'titulo_error':u'No se puede ver la publicación'})
        return render_to_response("publicaciones/error.html", extra_context,context_instance=RequestContext(request))
    return object_detail(request,
                         queryset = Publicacion.objects.all(),
                         template_object_name =  "Publicacion",
                         template_name = 'publicaciones/detalle.html',
                         object_id = object_id
                         )

@login_required
def crear(request,tipo_de_pub):
    model_a_pasar,form_a_pasar = get_form_for_object(str(tipo_de_pub))
    form_autores = AutorForm()
    form_expertos = ExpertoAutorForm()
    return create_object(request,
                         model = model_a_pasar,
                         form_class = form_a_pasar,
                         extra_context = {'form_autores':form_autores,
                                          'tipo_publicacion':tipo_de_pub,
                                          'form_expertos':form_expertos},
                         template_name = 'publicaciones/crear.html',
                         post_save_redirect = '/publicaciones/'
                         )

def get_form_a_pasar_por_tipo_de_pub(tipo_de_pub):
    if tipo_de_pub == 'articulo':
        form_a_pasar = ArticuloForm
    elif tipo_de_pub == 'capitulo':
        form_a_pasar = CapituloForm
    elif tipo_de_pub == 'libro':
        form_a_pasar = LibroForm
    elif tipo_de_pub == 'conferencia':
        form_a_pasar = ConferenciaForm
    elif tipo_de_pub == 'reporte':
        form_a_pasar = ReporteForm
    elif tipo_de_pub == 'tesis':
        form_a_pasar = TesisForm
    return form_a_pasar



@login_required
@user_passes_test(es_del_grupo_de_expertos,login_url='/accounts/signin/no_experto')
def crear_con_experto(request,tipo_de_pub):
    c={'tipo_publicacion':tipo_de_pub}
    form_a_pasar = get_form_a_pasar_por_tipo_de_pub(str(tipo_de_pub))
    form_autores = AutorForm()
    form_expertos = ExpertoAutorForm()
    if request.method == 'POST':                            
        form = form_a_pasar(request.POST,request.FILES)                                                
        if form.is_valid():
            try:
                new_pub = form.save(commit=False)
                new_pub.creador = request.user.get_profile().experto
                new_pub.save()
                form.save_m2m()
            except:
                c.update({'error':u'No tiene perfil de Experto. La publicación no se guardó.'})
                c.update(csrf(request))
                c.update({'form':form,'form_autores':form_autores,'form_expertos':form_expertos}) 
                return render_to_response("publicaciones/crear.html", c,context_instance=RequestContext(request)) 
            return HttpResponseRedirect('/publicaciones/' + str(new_pub.pk))
    else:
        form = form_a_pasar()
        
    c.update(csrf(request))
    c.update({'form':form,'form_autores':form_autores,'form_expertos':form_expertos})                 
    return render_to_response("publicaciones/crear.html", c,context_instance=RequestContext(request))



def get_form_a_pasar(publicacion):
    if publicacion.cast()._meta.verbose_name == 'articulo':
        return ArticuloForm
    elif publicacion.cast()._meta.verbose_name == 'capitulo':
        return CapituloForm
    elif publicacion.cast()._meta.verbose_name == 'libro':
        return LibroForm
    elif publicacion.cast()._meta.verbose_name == 'conferencia':
        return ConferenciaForm
    elif publicacion.cast()._meta.verbose_name == 'reporte':
        return ReporteForm
    elif publicacion.cast()._meta.verbose_name == 'tesis':
        return TesisForm
    return PublicacionForm

def get_model_a_pasar(publicacion):
    if publicacion.cast()._meta.verbose_name == 'articulo':
        return Articulo
    elif publicacion.cast()._meta.verbose_name == 'capitulo':
        return Capitulo
    elif publicacion.cast()._meta.verbose_name == 'libro':
        return Libro
    elif publicacion.cast()._meta.verbose_name == 'conferencia':
        return Conferencia
    elif publicacion.cast()._meta.verbose_name == 'reporte':
        return Reporte
    elif publicacion.cast()._meta.verbose_name == 'tesis':
        return Tesis
    return Publicacion
        
@login_required
def editar(request, object_id):
    publicacion = get_object_or_404(Publicacion,pk=object_id)
    form_a_pasar = get_form_a_pasar(publicacion)
    form_autores = AutorForm()
    autores = publicacion.autores_externos.all()
    form_expertos = ExpertoAutorForm()
    if publicacion.real_type.name == 'capitulo':
        tipo_de_pub = 'capitulo'
    else:
        tipo_de_pub = publicacion.real_type.name
    return update_object(request,
                         model = publicacion.cast().__class__,
                         form_class = form_a_pasar,
                         template_name = 'publicaciones/editar.html',
                         extra_context = {'form_autores':form_autores,
                                          #'autores':autores,
                                          'tipo_publicacion':tipo_de_pub,
                                          'form_expertos':form_expertos},
                         post_save_redirect = '/publicaciones/' + object_id,
                         object_id = object_id
                         )

@login_required
@user_passes_test(es_del_grupo_de_expertos,login_url='/accounts/signin/no_admin')
def editar_con_experto(request, object_id):
    c = {}
    publicacion = get_object_or_404(Publicacion, pk=object_id)
    form_a_pasar = get_form_a_pasar(publicacion)
    model_a_pasar = get_model_a_pasar(publicacion)
    try:
        if request.user.get_profile().experto == publicacion.creador:
            return update_object(request,
                         model = model_a_pasar,
                         form_class = form_a_pasar,
                         template_name = 'publicaciones/editar.html',
                         post_save_redirect = '/publicaciones/' + object_id,
                         object_id = object_id
                         )
        else:
            c.update({'error':u'Usted tiene perfil de Experto pero no es el creador'})  
            
    except:   
        c.update({'error':u'Usted no tiene perfil de Experto, no puede modificar la publicación'})
    c.update({'titulo_error':u'No se pudo modificar el publicación'})
    c.update({'object_id':object_id})               
    c.update(csrf(request))
    return render_to_response("publicaciones/error.html", c,context_instance=RequestContext(request))







@login_required
def eliminar(request, object_id):
    get_object_or_404(Publicacion, pk=object_id)
    return delete_object(request,
                         model = Publicacion,
                         template_name = 'publicaciones/confirmar_eliminar.html',
                         post_delete_redirect = '/publicaciones/',
                         object_id = object_id
                         )









@login_required
@user_passes_test(es_del_grupo_de_expertos,login_url='/accounts/signin/no_experto')
def eliminar_con_experto(request, object_id):
    c = {}
    publicacion = get_object_or_404(Publicacion, pk=object_id)
    model_a_pasar = get_model_a_pasar(publicacion)
    try:
        if request.user.get_profile().experto == publicacion.creador:
            return delete_object(request,
                         model = model_a_pasar,
                         template_name = 'publicaciones/confirmar_eliminar.html',
                         post_delete_redirect = '/publicaciones/',
                         object_id = object_id
                         )
        else:
            c.update({'error':u'Usted tiene perfil de Experto pero no es el creador'})  
            
    except:   
        c.update({'error':u'Usted no tiene perfil de Experto'})
    c.update({'titulo_error':u'No se pudo eliminar la publicación'})
    c.update({'object_id':object_id})               
    c.update(csrf(request))
    return render_to_response("publicaciones/error.html", c,context_instance=RequestContext(request))
